package com.learning.code.multithread.keyword.synchronize.method.sychronizedObject;

/**
 * 3
 */
public class MainTest {


    /**
     * 由这几个例子，可以看出，synchronized 关键字 取得的锁都是对象锁，即是每个类的具体的实例的锁。而不是类的某个方法或者某个代码片段的锁
     *  调用synchronized 修饰的方法一定是派对运行的
     * @param args
     */
    public static void main(String[] args) {

        //test1();
        test2();
        //test3();

    }

    /**
     *  线程A先持有对象myObject，并执行 它的同步 methodA，
     *   但是并不妨碍线程B 执行myObject 调用 它的 非同步方法methodB
     *
     *   结论： 线程可以采用异步的方式调用 被其他线程持有对象的非同步的方法，锁的是同步方法
     */
    public static void test1(){
        MyObject myObject = new MyObject();
        Thread a = new Thread(() -> {
            myObject.methodA();
        });
        a.setName("A");
        Thread b = new Thread(() -> {
            myObject.methodB();
        });
        b.setName("B");

        a.start();
        b.start();

      /*    打印 结果：
        methodB is begining,current thread is B
        methodA is begining,current thread is A
        methodB is end,current thread is B
        methodA is end,current thread is A*/
    }

    /**
     *   线程A先持有对象myObject，并执行 它的同步 methodA，执行完了
     *   线程C才开始执行myObject 执行 它的 同步方法methodC,
     *
     *   结论： 多线程调用同一对象的不同的同步方法，必须是同步的
     */
    public static void test2(){
        MyObject myObject = new MyObject();
        Thread a = new Thread(() -> {
            myObject.methodA();
        });
        a.setName("A");
        Thread C = new Thread(() -> {
            myObject.methodC();
        });
        C.setName("C");

        a.start();
        C.start();

   /*    打印 结果：
        methodA is begining,current thread is A
        methodA is end,current thread is A
        methodC is begining,current thread is C
        methodC is end,current thread is C */
    }


}
